package org.hzz.snake;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.time.LocalDateTime;
import java.util.List;

import javax.swing.JPanel;

import lombok.extern.java.Log;

/**
 * 这段代码定义了一个 SnakeView 类，它是一个 JPanel 的子类，用于显示贪吃蛇游戏的界面。让我们逐步解释这段代码：

private static final int UNIT_SIZE = 20;：定义了单元格的大小，用于绘制贪吃蛇的身体和食物。
private SnakeModel model;：用于保存与视图相关联的模型对象，以便在绘制界面时使用。用于保存与视图相关联的模型对象，以便在绘制界面时使用。
public SnakeView()：构造方法设置了面板的首选大小为 600x600 像素，并。
public void setModel(SnakeModel model)：设置模型对象的方法，用于将模型对象与视图关联起来。
@Override protected void paintComponent(Graphics g)：重写了 JPanel 的 paintComponent 方法，
在这个方法中绘制了游戏界面。首先调用父类的 paintComponent 方法以便绘制背景，
然后根据模型中贪吃蛇的位置和食物的位置，用绿色绘制贪吃蛇的身体，用红色绘制食物。
 */

@Log
// MVC模式中的View，负责显示游戏界面
public class SnakeView extends JPanel{
    // 定义了单元格的大小，用于绘制贪吃蛇的身体和食物。
    private static final int UNIT_SIZE = 20;
    // 用于保存与视图相关联的模型对象，以便在绘制界面时使用。
    private SnakeModel snakeModel;

    public SnakeView(){
        // 设置了面板的首选大小为 600x600 像素
        setPreferredSize(new Dimension(600, 600));
        // 将背景色设置为黑色
        setBackground(Color.BLACK);
    }

    public void setSnakeModel(SnakeModel snakeModel){
        this.snakeModel = snakeModel;
    }

    
    // 绘制游戏界面
    @Override
    protected void paintComponent(Graphics g) {
        log.info("绘制游戏界面 At" + LocalDateTime.now());
        // 首先调用父类的 paintComponent 方法以便绘制背景，
        super.paintComponent(g);
        // 根据模型中贪吃蛇的位置和食物的位置，用绿色绘制贪吃蛇的身体，用红色绘制食物。
        if(snakeModel != null){
            List<Point> snakeParts = snakeModel.getSnakeParts();
            // 头部给一个特别的颜色
            Point header = snakeParts.get(0);
            g.setColor(Color.ORANGE);
            g.fillRect(header.x, header.y, UNIT_SIZE, UNIT_SIZE);

            g.setColor(Color.green);
            for(int i = 1; i < snakeParts.size(); i++){
                
                g.fillRect(snakeParts.get(i).x, snakeParts.get(i).y,
                            UNIT_SIZE, UNIT_SIZE);
            }

            g.setColor(Color.RED);
            Point food = snakeModel.getFood();
            g.fillRect(food.x, food.y, UNIT_SIZE, UNIT_SIZE);
        }
    }


}
